﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using HA.ModFlow.Infrastructure;


namespace HA.MT3DMS.FileLayer
{
    public static   class ReadConcFile
    {
        #region 构造函数

        //public ReadConcFile()
        //{      
        //}

        //public ReadConcFile(string filePath)
        //{

        //    this.readConcFileResult = new ReadConcFileResult();

        //    this.readConcFileResult.ConcFilePath = filePath;

        //    this._filePath  = filePath;

        //}

        //public ReadConcFile(List<string> filePathList)
        //{ 

        //}


        #endregion

        #region 字段属性


        ///// <summary>
        ///// 要读取的文件的路径
        ///// </summary>
        //string _filePath;
   

        /// <summary>
        /// 保存读取文件的结果
        /// </summary>
        static  ReadConcFileResult  readConcFileResult;
      


        #endregion


        #region 内部方法

        /// <summary>
        /// 判断给定的文件是否存在
        /// </summary>
        /// <param name="filePath"></param>
        /// <returns></returns>
        private static   bool IsFileExist(string filePath)
        {
            try
            {
                if (System.IO.File.Exists(filePath))
                {
                    return true;
                }
                else
                {
                    return false;
                }

            }
            catch
            {
                return false;
            }
         
        }



        /// <summary>
        /// 得到一行字符串的个数
        /// </summary>
        /// <param name="Str">一行文字</param>
        /// <returns></returns>
        private  static int GetStringNumber(string Str)
        {
            Str = " " + Str + " "; //在字符串前后各加一个空，以便于后面处理
            int n = 0, n1 = 0, n2 = 0;

            if (Str != null && Str.Length > 2)
            {
                while (n2 >= 0)
                {
                    n1 = n2;
                    n2 = Str.IndexOf(" ", n1 + 1);
                    if ((n2 - n1) > 1)  //如果不是连续的空格，开始计数
                    {
                        n++;
                    }
                }
            }

            return n;

        }


        /// <summary>
        /// 得到指定位置的字符串,字符创长度为0或者出错返回 null
        /// </summary>
        /// <param name="Str"></param>
        /// <param name="index"></param>
        /// <returns></returns>
        private static string GetSpecifyString(string Str, int index)
        {
            Str = " " + Str + " ";
            string SubStr = "";
            int n = 0, n1 = 0, n2 = 0;

            try
            {

                //while (n2 >= 0)
                //{
                //    n1 = n2;
                //    n2 = Str.IndexOf(" ", n1 + 1);
                //    if ((n2 - n1) > 1)  //如果不是连续的空格，开始计数
                //    {
                //        n++;
                //        if (n == index)
                //        {
                //            SubStr = Str.Substring(n1, n2 - n1);
                //            return SubStr;
                //        }
                //    }
                //}

                //上下两种方法都可以

                for (int i = 0; i < Str.Length; i++)
                {

                    if (Str.Substring(i, 1) != " ")
                    {
                        n1 = i;
                        n2 = Str.IndexOf(" ", n1);
                        SubStr = Str.Substring(n1, n2 - n1);
                        i = n2;
                        n++;
                        if (n == index)
                        {
                            return SubStr;

                        }
                    }

                }
                return null;
            }
            catch 
            {
                return null;
            }

        }

        /// <summary>
        /// 出错时调用 错做包括：关闭读取文件的流，错误提示，初始化返回结果对象readConcFileResult
        /// </summary>
        /// <param name="readConcFileResult"></param>
        /// <param name="fs"></param>
        /// <param name="sr"></param>
        /// <param name="filePath"></param>
        private static  void ShowErrorMessage(ReadConcFileResult readConcFileResult, System.IO.FileStream fs, System.IO.StreamReader sr, string filePath)
        {
            if (sr != null)
            {
                sr.Close();
            }
            if (fs != null)
            {
                fs.Close();
            }

            System.Windows.Forms.MessageBox.Show("读取MT3D结果文件: " + filePath + "的过程出错！");
            readConcFileResult = new ReadConcFileResult();
 
        }


        #endregion


        #region 公有方法
        /// <summary>
        /// 
        /// 该方法暂时未使用
        /// 
        /// 读取MT3D的结果，如果出错或者文件破坏时  结果怎样处理  需要和调用方协商。。。。暂时按照重新 new ReadConcFileResult返回处理
        /// </summary>
        /// <param name="filePath"></param>
        /// <returns></returns>
        public static ReadConcFileResult ReadMT3DConcResultFile(string filePath)
        {

            return null;



            #region


            //System.IO.FileStream fs = null;
            //System.IO.StreamReader  sr = null;

            //try
            //{
            //    readConcFileResult = new ReadConcFileResult();

            //    if (System.IO.File.Exists(filePath))
            //    {
            //        fs = new System.IO.FileStream(filePath ,System.IO .FileMode .Open );
            //        sr = new System.IO.StreamReader(fs);

            //        #region 读取文件

            //        if (sr.EndOfStream !=true )
            //        {
            //             string line1 = sr.ReadLine();
            //             if (line1 !=null )
            //             {
            //                 if (line1 .Trim ()!="")
            //                 {
            //                     int strNum = GetStringNumber(line1);
                               
            //                     if (strNum >0)
            //                     {
            //                         //例如：    29     1     1    100.0      CONCENTRATION       21    15     8
            //                        //下面这句代码好危险，好菜。。。。。。。。。。。

            //                         if (strNum == 8)
            //                         {
            //                             #region 读取数据


            //                             string str1 = GetSpecifyString(line1, 1);
            //                             string str2 = GetSpecifyString(line1, 2);
            //                             string str3 = GetSpecifyString(line1, 3);
            //                             string str4 = GetSpecifyString(line1, 4);
            //                             string str5 = GetSpecifyString(line1, 5);
            //                             string str6 = GetSpecifyString(line1, 6);
            //                             string str7 = GetSpecifyString(line1, 7);
            //                             string str8 = GetSpecifyString(line1, 8);

            //                             if (str1 == null || str2 == null || str3 == null || str4 == null || str5 == null || str6 == null || str7 == null || str8 == null)
            //                             {

            //                             }
            //                             else
            //                             {
            //                                 #region 存储第一行数据

            //                                 int transStep = Convert.ToInt32(str1);//传输步长
            //                                 int timeStep = Convert.ToInt32(str2);//时间步长
            //                                 int stressStep = Convert.ToInt32(str3);//应力期
            //                                 double time = Convert.ToDouble(str4);//时间
            //                                 string conc = str5;//浓度
            //                                 int col = Convert.ToInt32(str6);//总列数 J
            //                                 int row = Convert.ToInt32(str7);//总行数 I
            //                                 int layer = Convert.ToInt32(str8);//总层数 K


            //                                 readConcFileResult.ConcFilePath = filePath;
            //                                 readConcFileResult.TransStep = transStep;
            //                                 readConcFileResult.TimeStep = timeStep;
            //                                 readConcFileResult.StressStep = stressStep;
            //                                 readConcFileResult.Time = time;
            //                                 readConcFileResult.Concentration = conc;
            //                                 readConcFileResult.NumJ = col;
            //                                 readConcFileResult.NumI = row;
            //                                 readConcFileResult.NumK = layer;

            //                                 #endregion

            //                                 //具体的浓度数据存放位置还未确定  暂时存储在三维数组中

            //                                 #region 浓度数据

            //                                 double[, ,] conValue = new double[row, col, layer];

            //                                 if (sr.EndOfStream != true)
            //                                 {
            //                                     for (int K = 0; K < layer; K++)
            //                                     {
            //                                         for (int I = 0; I < row; I++)
            //                                         {
            //                                             for (int J = 0; J < col; J++)
            //                                             {
            //                                                 if (sr.EndOfStream != true)
            //                                                 {
            //                                                     //不清楚数据的存放顺序  暂时按照 先遍历列 再遍历行 在遍历层的顺序

            //                                                     string str = sr.ReadLine();

            //                                                     if (str != null)
            //                                                     {
            //                                                         if (str.Trim() != "")
            //                                                         {
            //                                                             int numStr = GetStringNumber(str);
            //                                                             if (numStr > 0)
            //                                                             {
            //                                                                 string concentrationStr = GetSpecifyString(str, 1);
            //                                                                 if (concentrationStr != null)
            //                                                                 {
            //                                                                     double concentrationValue = Convert.ToDouble(concentrationStr);

            //                                                                     conValue[I, J, K] = concentrationValue;

            //                                                                 }
            //                                                                 else
            //                                                                 {
            //                                                                     ShowErrorMessage(readConcFileResult, fs, sr, filePath);
            //                                                                     return readConcFileResult;
            //                                                                 }


            //                                                             }
            //                                                             else
            //                                                             {
            //                                                                 ShowErrorMessage(readConcFileResult, fs, sr, filePath);
            //                                                                 return readConcFileResult;
            //                                                             }

            //                                                         }
            //                                                         else
            //                                                         {
            //                                                             ShowErrorMessage(readConcFileResult, fs, sr, filePath);
            //                                                             return readConcFileResult;

            //                                                         }
            //                                                     }
            //                                                     else
            //                                                     {
            //                                                         ShowErrorMessage(readConcFileResult, fs, sr, filePath);
            //                                                         return readConcFileResult;
            //                                                     }


            //                                                 }// if (sr.EndOfStream != true) 结束
            //                                             } // for (int J = 0; J < col ; J++) 结束           
            //                                         }// for (int I = 0; I < row ; I++)结束

            //                                     }// for (int K = 0; K < layer; K++)结束


            //                                 }

            //                                 readConcFileResult.ConcValue = conValue;


            //                                 #endregion

            //                                 readConcFileResult .Mt3dDataResult  = new CellCenterDataSet3d(conValue);

            //                                 readConcFileResult.Mt3dDataResult.Nrows = row;
            //                                 readConcFileResult.Mt3dDataResult.Ncols = col;
            //                                 readConcFileResult.Mt3dDataResult.Nlayers = layer;


            //                             }



            //                             #endregion

            //                         }

            //                     }

            //                 }     
            //             }

            //        }


            //        #endregion


            //        sr.Close();
            //        fs.Close();

            //    }
            //    else
            //    {
            //        System.Windows.Forms.MessageBox.Show("您要读取MT3D结果文件: " + filePath + "不存在！请检查！");
                
            //    }

            //    return readConcFileResult;
            //}
            //catch (Exception)
            //{
            //    ShowErrorMessage(readConcFileResult,fs,sr,filePath );

            //    return readConcFileResult;

            //}

          
          
          #endregion

        }



        #endregion





    }


   public  class ReadConcFileResult
   {

       #region 构造函数


       #endregion

       #region 字段属性

       string _concFilePath; //文件路径

       public string ConcFilePath
       {
           get { return _concFilePath; }
           set { _concFilePath = value; }
       }

       int _transStep=0;//传输步长数

       public int TransStep
       {
           get { return _transStep; }
           set { _transStep = value; }
       }

       int _timeStep=0;//时间步长数

       public int TimeStep
       {
           get { return _timeStep; }
           set { _timeStep = value; }
       }

       int _stressStep=0;//应力期数

       public int StressStep
       {
           get { return _stressStep; }
           set { _stressStep = value; }
       }

       double _time=0;//时间

       public double Time
       {
           get { return _time; }
           set { _time = value; }
       }

       string _concentration ;//浓度

       public string Concentration
       {
           get { return _concentration; }
           set { _concentration = value; }
       }

     

       int _numJ=0;//列

       public int NumJ
       {
           get { return _numJ; }
           set { _numJ = value; }
       }

       int _numI=0;//行

       public int NumI
       {
           get { return _numI; }
           set { _numI = value; }
       }

       int _numK=0;//层

       public int NumK
       {
           get { return _numK; }
           set { _numK = value; }
       }


       double[, ,] _concValue;
       /// <summary>
       /// 浓度结果  临时存放double[Row,Col ,Layer]
       /// </summary>
       public double[, ,] ConcValue
       {
           get { return _concValue; }
           set { _concValue = value; }
       }


       CellCenterDataSet3d _mt3dDataResult;

       public CellCenterDataSet3d Mt3dDataResult
       {
           get { return _mt3dDataResult; }
           set { _mt3dDataResult = value; }
       }


       #endregion


       #region 内部方法


       #endregion

       #region 公有方法


     


       #endregion




   }


}
